home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / langs / prolog68.zoo / prolog.68 / doc / liesmich next >
Encoding:
Text File  |  1994-06-03  |  26.3 KB  |  744 lines

  1. -------------------------------------------------------------------------------
  2.  
  3.  
  4.        /¯¯¯¯¯)          /¯)                /¯¯¯¯¯) /¯¯¯¯¯)
  5.       / /¯) /         / /               / ____/ / /¯) /
  6.      / (_/ /        / /              / /      / (_/ /
  7.     / ____/ /¯¯¯¯) /¯¯¯¯¯) / / /¯¯¯¯¯) /¯¯¯¯¯) /¯¯¯) /  ¯¯¯) /     /
  8.        / /     / /¯¯¯ / /¯) / / / / /¯) / / /¯) / (___/ / /¯) / / /¯) /
  9.       / /     / /    / (_/ / / / / (_/ / / (_/ /       / (_/ / / (_/ /
  10.      (_/     (_/    (_____/ (_/ (_____/ (___  /       (_____/ (_____/
  11.                        / /
  12.                       /¯¯¯¯ /
  13.                      (_____/
  14.  
  15.                 (Vorab-Version)
  16.  
  17.  
  18.  
  19.                © Copyright 1989-1994 Jens Kilian
  20.                 Alle Rechte vorbehalten
  21.  
  22.  
  23. ------- Inhaltsverzeichnis ----------------------------------------------------
  24.  
  25.     CODES            Vorübersetzte Versionen von Compiler und
  26.         BUILTINS.WAM    Laufzeitsystem
  27.         DEBUGGER.WAM
  28.         DRIVER.WAM
  29.         DSTRUCT.WAM
  30.         ENCODER.WAM
  31.         INDEXER.WAM
  32.         LIBRARY.WAM
  33.         SHELL.WAM
  34.         TMPALLOC.WAM
  35.         XLATOR.WAM
  36.  
  37.     DOC
  38.         LIESMICH        Dieses Dokument (deutsche Version)
  39.         README        Dieses Dokument (englische Version)
  40.  
  41.     INIT.WAM        Initialisierungsdateien
  42.     PROLOG.LST
  43.  
  44.     WAM.TOS         Hauptprogramm (Emulator, Systemfunktionen)
  45.     MWAM.TOS        Hauptprogramm, MiNT Library (ungetestet!)
  46.  
  47. ------- Kurzbeschreibung ------------------------------------------------------
  48.  
  49. Dieses Paket enthält die Vorabversion 0.94.17 von Prolog-68, einem nicht mehr
  50. ganz neuen :-) Prolog-System für den ATARI ST. Wenn das Programm fertig-
  51. gestellt ist, wird es als freie Software (NICHT als Public-Domain-Software!)
  52. zusammen mit dem Quellcode öffentlich zugänglich sein. Das wird noch etwas
  53. dauern.
  54.  
  55. Die vorliegende Version darf frei verbreitet, aber NICHT verändert oder
  56. kommerziell genutzt werden. Als kommerzielle Nutzung gilt auch der Vertrieb
  57. über einen Public-Domain-Versand, sofern die erhobene Gebühr für den Versand
  58. einer Einzeldiskette die Summe aus Diskettenpreis und Versandkosten um mehr
  59. als DM 2,- übersteigt.
  60.  
  61. Noch einmal:    Dies ist eine Vorabversion, d.h. daß ich noch nicht einmal
  62.         dafür garantiere, daß die hier gemachten Aussagen zutreffen!
  63.  
  64. Prolog-68 basiert auf der `Warren Abstract Machine'; es enthält einen (in
  65. Prolog geschriebenen) Compiler, der die Programmklauseln in einen Zwischencode
  66. übersetzt. Der Zwischencode wird als `direct threaded code' gespeichert und von
  67. einem Simulator abgearbeitet. Das Systemm erreicht so eine Geschwindigkeit
  68. von 12 kLIPS unter dem 'nrev'-Benchmark, was für Prolog auf dem Atari ST einen
  69. durchaus annehmbaren Wert darstellt. Das Programm wurde auf einem ST mit 4MB
  70. Hauptspeicher getestet, sollte aber in der vorliegenden Version auf allen
  71. Atari-Rechnern mit 680x0-Prozessor lauffähig sein. Bei Schwierigkeiten mit TTs,
  72. Falcons oder STs mit Beschleunigerkarten wird um genaue Fehlerbeschreibungen
  73. gebeten, weil ich mangels entsprechender Hardware keine eigenen Tests durch-
  74. führen kann. Wie üblich gilt für den verfügbaren Speicher `mehr ist besser';
  75. benötigt werden mindestens 250 KByte, um das Programm überhaupt laden zu
  76. können. Die Dateien im Ordner 'CODES' enthalten eine bereits übersetzte Version
  77. des Compilers und der Benutzerschnittstelle. DIESE DATEIEN DÜRFEN AUF KEINEN
  78. FALL VERÄNDERT WERDEN, WEIL PROLOG-68 SONST NICHT MEHR GESTARTET WERDEN KANN!
  79.  
  80. ------- Inkompatibilitäten zu früheren Versionen ------------------------------
  81.  
  82. Von Version 0.9 nach Version 0.91:
  83.  
  84. - Auf Prolog-Ebene werden alle Zeichen nach dem Unicode-Standard dargestellt
  85.   (ISO DIS 10646-1.2 Basic Multilingual Plane). Frühere Versionen verwendeten
  86.   stattdessen erweitertes ASCII nach ISO 8859-1 bzw. (noch früher) den Atari-
  87.   -Zeichensatz.
  88.   Der herausragende Unterschied ist die Darstellung von Zeilenenden in Text-
  89.   dateien. Alle eingelesenen Zeilenenden entsprechen in Prolog dem Zeichencode
  90.   16'2028 (ASCII NL = 16'0a wird bei der Ausgabe als gleichwertig betrachtet).
  91.   Programme, die is_endline/1 oder is_newline/1 zur Abfrage von Zeilenenden
  92.   benutzen, sollten keine Schwierigkeiten haben; das gilt auch für die
  93.   Verwendung der Escape-Sequenz "\n".
  94.  
  95.   (Da ich inzwischen feststellen mußte, daß dieses 'Feature' mehr Ärger als
  96.   Nutzen verursacht, werde ich es in der nächsten Version wieder rauswerfen.
  97.   Sorry.)
  98.  
  99. - Nach dem zukünftigen ISO-Standard hat ein 'cut' in der Vorbedingung eines
  100.   Aufrufs von '->'/2 keine Auswirkungen auf den Rest der Klausel.
  101.  
  102. - Die Prädikate constant/1 und nonconstant/1 sind verschwunden (durch atomic/1
  103.   bzw. nonatomic/1 ersetzen). Darüber wollen Sie nichts wissen.
  104.  
  105. Von Version 0.91 nach Version 0.93:
  106.  
  107. - Zeilenenden werden aus den erwähnten Gründen wieder als ASCII-Newlines
  108.   dargestellt.
  109.  
  110. - Die Dateiöffnungsmodi 'read_binary', 'write_binary' und 'append_binary'
  111.   sind nicht mehr erlaubt, weil sie durch das Konzept der 'Stream-Optionen'
  112.   aus dem ISO-Standard abgedeckt werden.
  113.  
  114. - Es ist nicht mehr möglich, compilierte Prädikate aufzulisten oder per
  115.   Einzelschritt abzuarbeiten. Zugriff auf einzelne Klauseln ist nur für
  116.   interpretierte (dynamische) Prädikate möglich. Es ist allerdings immer
  117.   noch möglich, im Debugger 'spy points' auf compilierte Prädikate zu setzen.
  118.  
  119. - Der Debugger kann jetzt explizit ein- und ausgeschaltet werden. Es ist nicht
  120.   mehr nötig, das zu untersuchende Prädikat mit anzugeben. Die Prädikate
  121.   debug/1 und trace/1 existieren nicht mehr.
  122.  
  123. Von Version 0.93 nach Version 0.94:
  124.  
  125. - absolute_file_name/2 kann unterschiedliche Ergebnisse liefern, weil es jetzt
  126.   auch '/' als Trennzeichen akzeptiert (z.B. unter MiNT).
  127.  
  128. ------- Bekannte Fehler -------------------------------------------------------
  129.  
  130. Die vorliegende Version 0.94.17 hat folgende Fehler, die in zukünftigen
  131. Versionen behoben sein werden:
  132.  
  133.     * NUL-Zeichen (ASCII 0) sind in Namen von Atomen nicht erlaubt.
  134.  
  135.     * Einige Datenbankoperationen können ein fehlerhaftes Update-Verhalten
  136.       aufweisen. (D.h. daß eine Veränderung auch für Aufrufe sichtbar sein
  137.       kann, die vor dieser Veränderung begannen.)
  138.  
  139. ------- Programmaufruf --------------------------------------------------------
  140.  
  141. Zulässig sind die folgenden Kommandozeilen-Optionen:
  142.  
  143.     -help        Gibt eine Kurzbeschreibung der zulässigen Optionen aus.
  144.  
  145.     -debug        Schaltet einen internen Testmodus ein. In der jetzigen
  146.             Form dürfte der Autor der einzige sein, der mit dieser
  147.             Option etwas anfangen kann.
  148.  
  149.     -dribble <File> Öffnet eine Datei, in der alle von der Tastatur ein-
  150.             gegebenen Zeichen mitprotokolliert werden (nützlich zum
  151.             Beschreiben von Fehlern).
  152.  
  153.     -code    <Größe> Vergibt Speicher für den Codebereich; dort werden alle
  154.             langlebigen Datenstrukturen (z.B. Atome, Funktoren und
  155.             Klauseln) gespeichert.
  156.  
  157.     -global <Größe> Vergibt Speicher für den globalen Bereich, in dem alle
  158.             während des Programmablaufs entstehenden Terme abgelegt
  159.             werden.
  160.  
  161.     -local    <Größe> Vergibt Speicher für den lokalen Bereich, der zur
  162.             Kontrolle des Programmablaufs und zum Speichern von
  163.             lokalen Variablen benutzt wird.
  164.  
  165.     -reserve<Größe> Gibt Speicher ans Betriebssystem zurück.
  166.  
  167. Prolog-68 speichert alle Informationen in drei großen Speicherbereichen.
  168. Die Größe dieser Bereiche wird beim Programmstart festgelegt und zur
  169. Laufzeit nicht mehr verändert. Diese Einschränkung kann dazu führen, daß
  170. ein Prolog-Programm wegen Speichermangel abgebrochen wird, obwohl genug
  171. freier Speicher vorhanden ist (zukünftige Versionen werden einen
  172. Mechanismus enthalten, mit dem der freie Speicher zur Laufzeit neu verteilt
  173. werden kann). Auf Rechnern mit kleinem Hauptspeicher ist es daher wichtig,
  174. beim Start des Programms die Größen der Speicherbereiche richtig zu setzen.
  175. Prolog-68 benutzt ohne zusätzliche Angaben eine sehr grobe Aufteilung, die
  176. nur bei reichlich freiem Speicher zuverlässig funktioniert. Auf STs mit
  177. nur 1MB RAM sollte zumindest der Codebereich auf ca. 250-300 KB gesetzt
  178. werden; bei noch weniger Speicher stellen 150 KB das absolut nötige
  179. Minimum dar.
  180.  
  181. Der verfügbare Speicher kann über die Optionen '-code', '-global', '-local'
  182. und '-reserve' auf die verschiedenen Bereiche verteilt werden. Diese Optionen
  183. dürfen in beliebiger Reihenfolge angegeben werden und auch mehrfach vorkommen
  184. (wobei dann die einzelnen Werte summiert werden).
  185.  
  186. Alle vier Optionen müssen von einem zusätzlichen Parameter gefolgt werden,
  187. der die Größe des zu vergebenden Speicherbereichs angibt. Er besteht aus
  188. einer Dezimalzahl, die von einem der Zeichen 'k', 'K', 'm', 'M' oder '%'
  189. gefolgt werden kann. Bei Angabe eines der Buchstaben oder beim Fehlen des
  190. zusätzlichen Zeichens wird die entsprechende Anzahl Bytes (bzw. KBytes oder
  191. MBytes) reserviert; bei Angabe von '%' wird stattdessen der angegebene
  192. Prozentsatz des noch nicht vergebenen Speichers benutzt. Aufeinanderfolgende
  193. Prozentangaben beziehen sich auf denselben Gesamtwert.
  194.  
  195. Fehlen in der Kommandozeile Angaben zu einem oder mehreren der drei Bereiche,
  196. so wird der gesamte nach Abarbeitung der Kommandozeile verbleibende Speicher
  197. auf die fehlenden Bereiche verteilt, und zwar im Verhältnis 1:2:4 für
  198. Codebereich, lokalen und globalen Bereich. Wie oben erwähnt, ist diese 
  199. Aufteilung für Rechner mit wenig Speicher nicht sinnvoll -- dort muß 
  200. zumindest der Codebereich vergrößert werden.
  201.  
  202. Bleibt nach der Aufteilung Speicher übrig, so wird dieser an das
  203. Betriebssystem zurückgegeben. Das ist insbesondere dann wichtig, wenn (von
  204. Prolog aus oder in einem Multitasking-System wie MiNT) andere Programme
  205. aufgerufen werden sollen. Die Option '-reserve' tut im Prinzip dasselbe,
  206. erlaubt aber die explizite Angabe der Größe des zurückgegebenen
  207. Speicherbereichs im selben Format wie bei den anderen Optionen.
  208.  
  209. Es folgen ein paar Beispiele, die die Flexibilität dieses Verfahrens
  210. verdeutlichen sollen. Angenommen sei, daß beim Programmstart genau 2 MByte
  211. an Hauptspeicher zur Verfügung stehen:
  212.  
  213. -code 1M -global 50% -local 25%
  214.     Der Codebereich erhält zunächst 1 MByte. Vom verbleibenden Speicher
  215.     geht die Hälfte (512 KByte) an den globalen Bereich, ein Viertel
  216.     (also 256 KByte) an den lokalen Bereich. Es verbleibt ein Rest
  217.     von 256 KByte, der ans Betriebssystem zurückgeht.
  218.  
  219. -code 25% -local 512K -code 25%
  220.     Von den ursprünglichen 2 MByte wird zunächst ein Viertel für den
  221.     Codebereich reserviert. Weitere 512 KByte gehen an den lokalen Bereich.
  222.     Es verbleiben 1 MByte, von denen wiederum ein Viertel dem Codebereich
  223.     zugeschlagen wird. Der restliche Speicher wird für den globalen Bereich
  224.     verwendet, da für diesen keine Angabe gemacht wurde.
  225.  
  226. Keine Angabe (Default)
  227.     1/7 des Speichers geht an den Codebereich, 2/7 an den lokalen Bereich.
  228.     Die restlichen 4/7 werden für den globalen Bereich verwendet. Es wird
  229.     kein Speicher ans Betriebssystem zurückgegeben.
  230.  
  231. ------- Vordefinierte Prädikate -----------------------------------------------
  232.  
  233. Ich bemühe mich, ein möglichst vollständiges Prolog zu erstellen, das zum
  234. zukünftigen ISO-Standard kompatibel ist. Die aktuelle Version wurde haupt-
  235. sächlich von Edinburgh-Prolog und den davon abgeleiteten Dialekten inspiriert;
  236. deshalb können sich viele Details noch ändern.
  237. Die meisten vordefinierten Prädikate sind bereits implementiert, können aber
  238. hier nur kurz beschrieben werden:
  239.  
  240.     - Steuerung:
  241.  
  242.     ','/2            (übliche Kontrollkonstrukte)
  243.     ';'/2
  244.     '!'/2
  245.     '->'/2
  246.     call/1
  247.     '\+'/1            (nicht-Beweisbarkeit, keine echte Verneinung)
  248.     once/1
  249.     true/0
  250.     otherwise/0        (= true/0)
  251.     fail/0
  252.     false/0         (= fail/0)
  253.     repeat/0
  254.     if_exception/3        (Fehlerbehandlung)
  255.     signal_exception/1
  256.     signal_error/3
  257.     propagate_error/4
  258.     trap/2
  259.     set_error_handler/3
  260.  
  261.     Der 'cut' funktioniert auch innerhalb von Metacalls, er ist dort
  262.     aber in seiner Reichweite beschränkt. Im Aufruf 'call(X)' wirkt ein
  263.     in 'X' vorkommender 'cut' nur innerhalb der Klammern. Eine Faustregel:
  264.     `Buchstaben blockieren den cut'.
  265.  
  266.     '->'/2 wirkt wie ein 'cut', der auf einen Teil einer Klausel beschränkt
  267.     ist. Der Aufruf  (P -> Q; R)  wirkt wie ein IF/THEN/ELSE-Konstrukt:
  268.     kann P erfüllt werden, dann wird Q aufgerufen, andernfalls R.
  269.     (P -> Q) allein wirkt wie (P -> Q; fail).
  270.     Der ISO-Standard verlangt, daß ein 'cut' innerhalb der Vorbedingung
  271.     (P im Beispiel) keine Auswirkungen auf den Rest der Klausel hat. Die
  272.     obige Faustregel gilt hier also NICHT!
  273.  
  274.     if_exception/3 und signal_exception/1 werden in einer der nächsten
  275.     Versionen durch die ISO-Versionen (catch/3 und throw/1) ersetzt werden.
  276.     Die Prädikate signal_error/3, propagate_error/4, trap/2 und
  277.     set_error_handler/3 werden zugunsten einer ISO-kompatiblen Fehler-
  278.     behandlung verschwinden.
  279.  
  280.     - Ein-/Ausgabe:
  281.  
  282.     read/1            (Ein-/Ausgabe von Termen)
  283.     write/1
  284.     writeq/1
  285.     display/1        (Ausgabe immer nach 'user'!)
  286.     write_canonical/1   (Ausgabe in Präfixform, heißt auch displayq/1)
  287.     print/1         (Ausgabe über portray/1, falls vom Benutzer
  288.                  definiert)
  289.     portray_clause/1    (Ausgabe von Klauseln in leicht lesbarer Form)
  290.  
  291.     get0/1            (Ein-/Ausgabe von Zeichen)
  292.     get/1
  293.     skip/1            (*)
  294.     put/1            (*)
  295.     nl/0
  296.     tab/1            (* diese Prädikate können einen arithmetischen
  297.                    Ausdruck als Parameter erhalten)
  298.  
  299.     is_endfile/1        (Dateiendezeichen festlegen)
  300.     is_newline/1        (Zeilenendezeichen festlegen)
  301.     is_newpage/1        (Seitenendezeichen festlegen)
  302.     is_endline/1        (Zeilenende erkennen - nur mit instantiiertem
  303.                  Argument aufrufen!)
  304.  
  305.     open/4            (Verwaltung von Datenströmen)
  306.     open/3
  307.     open_null_stream/1
  308.     close/1
  309.     current_stream/3
  310.     stream_property/2
  311.     nofileerrors/0
  312.     fileerrors/0
  313.     flush_output/1
  314.     set_input/1
  315.     set_output/1
  316.     current_input/1
  317.     current_output/1
  318.     absolute_file_name/2
  319.  
  320.     read/2            (Ein-/Ausgabe von Termen auf beliebige Datenströme)
  321.     write/2
  322.     writeq/2
  323.     display/2
  324.     write_canonical/2   (heißt auch displayq/2)
  325.     print/2
  326.  
  327.     get0/2            (Zeichen-Ein-/Ausgabe auf beliebige Datenströme)
  328.     get/2
  329.     skip/2            (*)
  330.     put/2            (*)
  331.     nl/1
  332.     tab/2            (* siehe oben)
  333.  
  334.     character_count/2   (Abfrage von Datenströmen)
  335.     line_count/2
  336.     line_position/2
  337.     stream_position/2
  338.     set_stream_position/2
  339.     stream_position/3
  340.  
  341.     see/1            (Prolog-10-kompatible Dateiverwaltung)
  342.     seeing/1
  343.     seen/0
  344.     tell/1
  345.     telling/1
  346.     told/0
  347.  
  348.     ttyget0/1        (Prolog-10-kompatible Terminal-Ein-/Ausgabe)
  349.     ttyget/1
  350.     ttyskip/1
  351.     ttyput/1
  352.     ttynl/0
  353.     ttytab/1
  354.  
  355.     op/3            (Operatoren definieren & löschen)
  356.     current_op/3        (Operatoren abfragen)
  357.  
  358.     sread/2         (Term mit Symboltabelle lesen)
  359.     sread/3         (dasselbe mit Angabe eines Datenstroms)
  360.  
  361.     Ein Datenstrom ist ein spezielles Objekt, das z.B. mit
  362.  
  363.           open(+Dateiname, +Modus, -Datenstrom)
  364.      oder open(+Dateiname, +Modus, -Datenstrom, +Optionen)
  365.  
  366.     erzeugt werden kann. `Dateiname' ist der Name einer Datei, `Modus' muß
  367.     eines der Atome 'read', 'write' oder 'append' sein. `Optionen', falls
  368.     angegeben, muß eine Liste sein, die nur Elemente der folgenden Arten
  369.     enthalten darf; anhand dieser Angabe wird die Art des geöffneten
  370.     Datenstroms festgelegt:
  371.  
  372.       type(Type)        Der Typ der Daten, die der Strom enthält.
  373.                 Erlaubt sind 'text' (Atari-Textformat), 'utf'
  374.                 (Text, der Zeichen aus anderen Zeichensätzen
  375.                 enthalten kann), oder 'binary' (rohe Bytes).
  376.       alias(Alias)        Ein Alias-Name für den Datenstrom (`Alias' muß
  377.                 ein Atom sein).
  378.       eof_action(Action)    Gibt an, wie der Versuch, über das Dateiende
  379.                 hinaus zu lesen, behandelt wird; entweder
  380.                 'error' (Fehler wird ausgelöst), 'eof_code'
  381.                 (Dateiendezeichen wird zurückgegeben) oder
  382.                 'reset' (Zurücksetzen).
  383.       reposition        Nur aus Kompatibilitätsgründen vorhanden - in
  384.                 Prolog-68 können alle Dateien, die vom Benutzer
  385.                 geöffnet werden, positioniert werden.
  386.  
  387.     Der erzeugte Datenstrom kann in Prädikaten wie z.B.
  388.  
  389.         write(+Datenstrom, ?Term)
  390.  
  391.     benutzt und mit
  392.  
  393.         close(+Datenstrom)
  394.  
  395.     wieder geschlossen werden.
  396.  
  397.     Neben diesen Datenströmen für Dateien gibt es noch vordefinierte
  398.     Datenströme, die über folgende Namen angesprochen werden:
  399.  
  400.         user        (zur Kompatibilität)
  401.         user_input
  402.         user_output
  403.         user_error
  404.  
  405.     - Arithmetik:
  406.  
  407.     'is'/2            (Auswertung von Ausdrücken)
  408.  
  409.     '=:='/2         (Vergleich von Ausdrücken)
  410.     '=\='/2
  411.     '<'/2
  412.     '=<'/2
  413.     '>'/2
  414.     '>='/2
  415.  
  416.     - Termklassifizierung:
  417.  
  418.     var/1
  419.     nonvar/1
  420.     atom/1
  421.     integer/1
  422.     atomic/1
  423.  
  424.     nonatomic/1        (Verneinung von atomic/1)
  425.     composite/1        (zusammengesetzter Term?)
  426.     simple/1        (Verneinung von composite/1)
  427.     callable/1        (aufrufbarer Term?)
  428.  
  429.     - Strukturzugriff:
  430.  
  431.     functor/3
  432.     arg/3
  433.     '=..'/2
  434.  
  435.     name/2            (Konvertierung zwischen Konstanten und Strings)
  436.     atom_chars/2
  437.     number_chars/2
  438.  
  439.     numbervars/3        (Variablen numerieren, z.B. für write/1)
  440.  
  441.     - Vergleiche von beliebigen Termen:
  442.  
  443.     '=='/2
  444.     '\=='/2
  445.     '@<'/2
  446.     '@=<'/2
  447.     '@>'/2
  448.     '@>='/2
  449.     compare/3
  450.     sort/2
  451.     msort/2
  452.     keysort/2
  453.  
  454.     Beim Vergleichen von Termen mit '@<', ..., '@>=' wird folgende
  455.     totale Ordnung über der Menge aller Terme benutzt:
  456.  
  457.     a) Variablen @< Zahlen @< Atome @< Zusammengesetzte Terme
  458.  
  459.     b) Variable1 @< Variable2    ist eindeutig definiert, hat aber
  460.                      keine Aussagekraft für den Benutzer
  461.  
  462.     c) Zahl1 @< Zahl2    wenn Zahl1 < Zahl2
  463.  
  464.     d) Atom1 @< Atom2    wenn der Name von Atom1 lexikographisch
  465.                 kleiner ist als der Name von Atom2
  466.  
  467.     e) Term1 @< Term2    wenn i) die Stelligkeit von Term1 kleiner als
  468.                      die Stelligkeit von Term2 ist
  469.                  ii) die Stelligkeiten gleich sind und
  470.                      Funktor(Term1) @< Funktor(Term2)
  471.                 iii) die Stelligkeiten und Funktoren gleich
  472.                      sind und es ein i gibt, so daß
  473.  
  474.                        für alle j, 1 ≤ j < i:
  475.                        Argument(Term1, j) == Argument(Term2, j)
  476.  
  477.                        und
  478.                        Argument(Term1, i) @< Argument(Term2, i)
  479.  
  480.     compare/3 verhält sich so, als ob es wie folgt definiert wäre:
  481.  
  482.         compare('<', X, Y) :- X @< Y.
  483.         compare('=', X, Y) :- X == Y.
  484.         compare('>', X, Y) :- X @> Y.
  485.  
  486.     sort/2, msort/2 und keysort/2 sortieren Listen gemäß der obigen
  487.     Ordnungsrelation. sort/2 entfernt doppelt vorkommende Elemente,
  488.     msort/2 tut dies nicht; keysort/2 erwartet eine Liste, deren Elemente
  489.     die Form
  490.  
  491.         Key - Value
  492.  
  493.     besitzen. Dabei werden die 'Values' ignoriert, die 'Keys' dienen als
  494.     Sortierschlüssel. keysort/2 behält doppelt auftretende Elemente bei;
  495.     diese erscheinen im Ergebnis in derselben Reihenfolge wie im Original.
  496.     Beispiel:
  497.  
  498.         | ?- keysort([4-a, 1-b, 5-c, 1-d, 4-e, 0-f], Sorted).
  499.         Sorted = [0-f, 1-b, 1-d, 4-a, 4-e, 5-c]
  500.  
  501.     Diese drei Prädikate haben im besten Fall linearen Aufwand, im
  502.     schlechtesten Fall sind sie O(NlogN) (woraus messerscharf geschlossen
  503.     werden kann, daß es sich hierbei NICHT um 'Quicksort' handelt).
  504.  
  505.     - Programme laden:
  506.  
  507.     compile/1        (alle nicht als dynamisch deklarierten Prädikate
  508.                  werden compiliert)
  509.     consult/1        (nur laden, nichts compilieren)
  510.     reconsult/1        (identisch mit consult/1, nur aus Gründen der
  511.                  Kompatibilität vorhanden)
  512.  
  513.     Die folgenden Direktiven aus dem ISO-Standard werden erkannt
  514.     (weitere werden in zukünftigen Versionen folgen):
  515.  
  516.       :-dynamic ...     (Prädikat als dynamisch deklarieren)
  517.       :-discontiguous ...    (wird in Prolog-68 nicht benötigt)
  518.       :-include ...     (Datei einfügen)
  519.  
  520.     - Programmzustand:
  521.  
  522.     listing/0        (alle dynamischen Prädikate auflisten)
  523.     listing/1        (einige dynamische Prädikate auflisten)
  524.  
  525.     current_atom/1        (Abfrage von momentan bekannten Atomen etc.)
  526.     current_predicate/2
  527.     predicate_property/2
  528.  
  529.     halt/0            (Programm anhalten)
  530.     halt/1            (dito, mit Angabe des Exit-Codes)
  531.     break            (verschachtelte Instanz von Prolog aufrufen)
  532.     abort            (Programmabbruch und zurück zum ersten Prompt)
  533.  
  534.     - Debugger:
  535.  
  536.     trace/0         (Debugger im Kriechmodus aktivieren)
  537.     debug/0         (Debugger im Sprungmodus aktivieren)
  538.     nodebug/0        (Debugger deaktivieren)
  539.  
  540.     spy/1            (Haltepunkte setzen & löschen)
  541.     nospy/1
  542.     leash/1
  543.     harness/1
  544.     debugging/1
  545.     unknown/2        (Überwachung undefinierter Prädikate)
  546.  
  547.     unknown(-OldAction, +NewAction)  ist eine abgekürzte Version von
  548.     prolog_flag(unknown, -OldAction, +NewAction)  (siehe dort).
  549.  
  550.     Nähere Informationen kann ich hier nicht geben, sie sollten aber
  551.     in jedem besseren Prolog-Lehrbuch zu finden sein.
  552.     
  553.     - Datenbank:
  554.  
  555.     abolish/1        (Prädikate ganz löschen)
  556.     abolish/2
  557.     asserta/1        (Klauseln zu einem dynamischen Prädikat hinzufügen)
  558.     assertz/1
  559.     assert/1        (= asserta/1)
  560.     retract/1        (Klauseln eines dynamischen Prädikats löschen)
  561.     retractall/1
  562.     clause/2        (Klauseln eines dynamischen Prädikats abfragen)
  563.  
  564.     - Datenbankverweise:
  565.  
  566.     Datenbankverweise dienen zum schnelleren Zugriff auf gespeicherte
  567.     Klauseln, Terme etc.
  568.  
  569.     asserta/2        (wie oben, mit Rückgabe eines Datenbankverweises)
  570.     assertz/2
  571.     assert/2
  572.     clause/3
  573.  
  574.     instance/2        (Klausel oder Term zu gegebenem Verweis abfragen)
  575.     erase/1         (Klausel oder Term zu gegebenem Verweis löschen)
  576.  
  577.     - Interne Datenbank:
  578.  
  579.     Die interne Datenbank gibt es nur aus Effizienzgründen. Mit den
  580.     zugehörigen Prädikaten können nur Terme, keine Klauseln gespeichert
  581.     werden.
  582.  
  583.     recorda/3
  584.     recordz/3
  585.     recorded/3
  586.     current_key/2
  587.  
  588.     Mit    recorda(+Schlüssel, +Term, -Verweis)
  589.     bzw.    recordz(+Schlüssel, +Term, -Verweis)
  590.     kann der `Term' unter dem `Schlüssel' in der internen Datenbank
  591.     gespeichert werden. Als Ergebnis erhält man einen Verweis auf
  592.     den gespeicherten Term, der zum Löschen über erase/1 verwendet
  593.     werden kann. Mit  recorded(+S, ?T, ?V)    kann man den gespeicherten
  594.     Term wieder zurückholen.  current_key(?KeyName, ?KeyTerm)  ermöglicht
  595.     die Abfrage aller vorhandenen Schlüssel.
  596.  
  597.     - Mengenoperationen:
  598.  
  599.     setof/3 und bagof/3 sind noch nicht implementiert.
  600.  
  601.     findall/3        (alle Lösungen eines Aufrufs finden)
  602.  
  603.     Der Unterschied zwischen findall/3 und bagof/3 liegt in der
  604.     Behandlung freier Variablen in dem Aufruf, der als zweiter Parameter
  605.     übergeben wird. bagof/3 sammelt alle Lösungen, für die sich für diese
  606.     Variablen der gleiche Wert ergibt, während findall/3 freie Variablen
  607.     als existenzquantifiziert ansieht.
  608.  
  609.     - Grammatikregeln:
  610.  
  611.     expand_term/2        (Wird aufgerufen, bevor eine eingelesene Klausel
  612.                  compiliert wird; erledigt die Umsetzung von
  613.                  Grammatikregeln. Der Benutzer kann das Prädikat
  614.                  term_expansion/2 definieren, um zusätzliche
  615.                  Umsetzungen vorzunehmen.)
  616.  
  617.     phrase/3        (Aufruf einer Grammatikregel)
  618.     phrase/2
  619.  
  620.     Bei phrase/[2,3] darf eine komplette Phrase (rechte Seite einer
  621.     Grammatikregel) angegeben werden. phrase/2 ist folgendermaßen
  622.     definiert:
  623.  
  624.         phrase(Phrase, Liste) :- phrase(Phrase, Liste, []).
  625.  
  626.     - Sonstiges:
  627.  
  628.     '='/2            (Unifikation)
  629.  
  630.     length/2        (Listenoperationen)
  631.     member/2
  632.     memberchk/2
  633.     append/3
  634.  
  635.     prolog_flag/3        (globale Flags abfragen/verändern)
  636.     prolog_flag/2
  637.     prompt/2        (Eingabeprompt abfragen/verändern)
  638.     statistics/0        (Statistiken ausgeben)
  639.     statistics/2        (Statistiken abfragen)
  640.  
  641.     garbage_collect/0   (Speicherbereinigung)
  642.     system/1        (Übergabe eines Atoms an eine Shell, z.B. Guläm)
  643.  
  644.     prolog_flag/2 und prolog_flag/3 verwalten globale Flags, die
  645.     bestimmte interne Abläufe steuern. Der Wert eines Flags ist - im
  646.     Gegensatz zu anderen Prolog-Systemen - immer eine Integerzahl (aber
  647.     das kann sich in zukünftigen Versionen noch ändern). Im Moment gibt es
  648.     folgende Flags:
  649.  
  650.     Name            Werte (Default) Funktion
  651.  
  652.     character_escapes    0, 1    (0)    Auswertung von Escape-Sequenzen
  653.                         bei der Ein- und Ausgabe.
  654.     fileerrors        0, 1    (1)    Ausgabe von Fehlermeldungen bei
  655.                         nichtexistierenden Dateien etc.
  656.     gc_trace        0, 1, 2 (0)    Ausgabe von Informationen über
  657.                         Speicherbereinigung (0=keine,
  658.                         1=Kurzmeldung, 2=vollständig)
  659.     unknown         0, 1    (1)    Behandlung undefinierter
  660.                         Prädikate (0=Fehlschlag,
  661.                         1=Fehler erzeugen)
  662.     error_handling        0, 1, 2 (2)    Art der Fehlerbehandlung
  663.                         (0=nur Fehlschlag, 1=Aufruf
  664.                         einer Fehlerbehandlung,
  665.                         2=zusätzliche Fehlermeldungen)
  666.  
  667.     Mit  prolog_flag(+Flag, -OldValue, +NewValue)  kann man den Wert eines
  668.     Flags verändern.  prolog_flag(?Flag, ?Value)  dient zur Abfrage ohne
  669.     Veränderung.
  670.  
  671.     statistics/2 erhält als ersten Parameter eines der folgenden
  672.     Schlüsselworte:
  673.  
  674.     'runtime'        Abfrage der Laufzeit
  675.  
  676.     'memory'        Abfrage der verschiedenen Speicherbereiche
  677.     'core'            (mehrfach belegt, z.B. heap = program)
  678.     'program'
  679.     'heap'
  680.     'global_stack'
  681.     'local_stack'
  682.     'trail'
  683.  
  684.     'garbage_collection' Statistiken über Speicherbereinigung
  685.  
  686.     Der zweite Parameter wird mit einer Liste von Zahlen unifiziert, die
  687.     das Ergebnis der Abfrage darstellen.
  688.  
  689. Es ist mir klar, daß die oben gemachten Beschreibungen bei weitem nicht
  690. ausreichen. Leider habe ich noch keine vernünftige Dokumentation, die ich
  691. mitliefern könnte; ein mit LaTeX geschriebenes Handbuch ist aber zumindest
  692. in Arbeit.
  693.  
  694. ------- Sonstiges -------------------------------------------------------------
  695.  
  696. Adressen:
  697.  
  698. Teutche Puntespest:    Jens Kilian
  699.             Holunderstraße 19
  700.         D-71083 Herrenberg
  701.  
  702. Internet:    jensk@hpbbn.bbn.hp.com
  703. MausNet:    Jens Kilian @ BB
  704.  
  705.  
  706. Ich sehe mich außerdem zu folgenden Äußerungen gezwungen, weil es zu viele
  707. unvernünftige Menschen gibt:
  708.  
  709.              Ausschluss der Gewährleistung
  710.  
  711. - Weil das Programm kostenlos genutzt werden darf, wird für das
  712.   Programm keinerlei Gewährleistung eingeräumt, soweit dies gesetzlich
  713.   zulässig ist. Falls nicht anderweitig schriftlich angegeben, stellen
  714.   die Urheber und/oder Dritte das Programm `so wie es ist' zur
  715.   Verfügung, ohne Gewährleistung jedweder Art, eingeschlossen die Gewähr
  716.   zur Erreichung eines bestimmten Verwendungszwecks, aber nicht
  717.   beschränkt auf diese. Die Benutzung erfolgt auf eigene Gefahr; das
  718.   gesamte Risiko in Bezug auf Qualität und Leistung des Programms liegt
  719.   bei Ihnen. Sollte sich das Programm als fehlerhaft erweisen, so tragen
  720.   Sie alle Kosten für anfallende Wartungs-, Reparatur-oder
  721.   Korrekturarbeiten.
  722.  
  723. - Soweit gesetzlich zulässig, haften die Urheber oder Dritte, die das
  724.   Programm wie oben gestattet verändern und/oder weiterverbreiten, für
  725.   keinerlei Schäden (einschliesslich irgenwelcher unmittelbaren Schäden,
  726.   mittelbaren Schäden, Folgeschäden und Drittschäden), die aus der
  727.   Benutzung oder der Unmöglichkeit der Benutzung des Programms entstehen
  728.   (einschliesslich des Verlusts oder der Verfälschung von Daten,
  729.   irgendwelcher materiellen Verluste, die Ihnen oder Dritten entstehen,
  730.   oder des Versagens des Programms, mit irgendeinem anderen Programm
  731.   zusammenzuarbeiten, aber nicht beschränkt auf diese), sogar in dem
  732.   Fall, daß besagten Urhebern oder Dritten die Möglichkeit der
  733.   Entstehung solcher Schäden bekannt war oder bekannt gemacht wurde.
  734.  
  735.  
  736. Meine Arbeitgeber haben noch nie was von Prolog-68 gehört, also sparen Sie sich
  737. die Mühe.
  738.  
  739. -------------------------------------------------------------------------------
  740.  
  741.     Viel Spaß,
  742.  
  743.         Jens Kilian
  744.